EventBridgeとLambdaを使ってEC2の再起動を検知してメールで通知してみた
どうもさいちゃんです。今回は EventBridge と Lambda を使って EC2 の再起動を検知し、SNS で担当者に通知する方法をご紹介します。
やりたいこと
EventBridge と Lmabda と SNS を使用して EC2 が再起動した際に任意のメッセージを管理者宛にメールで送信してみようと思います。
Ec2 の再起動を
構成図はこんな感じです。
作業の大まかな手順は以下の通りです。
- SNS トピックを作成する
- 1 で作成した SNS トピックを使用してメールを送信する Lambda 関数を作成する
- EC2 の再起動を検知した時に 2 で作成した Lambada 関数を呼び出すための EventBridge ルールを作成する
それではさっそくやってみましょう。
やってみる
SNS トピックの作成
まず初めに通知先となる SNS トピックを作成していきます。
AmazonSNS コンソールのナビゲーションペインから トピックを選択し、 トピックを作成から今回使用する SNS トピックの作成を始めます。
タイプは今回 スタンダードを選択しています。
分かりやすい名前を付けましょう。私は my-notify-sns-topicとしています。
他はデフォルトの設定でトピックを作成します。
トピックが正常に作成されたので、サブスクリプションとして自身のメールアドレスを登録していきます。
先ほど作成したトピックを選択し、詳細画面からサブスクリプションの作成を選択します。
トピック ARN が先ほど作成した「my-notify-sns-topic」のものになっていることを確認し、今回はメールアドレスに通知を飛ばしたいのでプロトコルに E メールを選択します。
エンドポイントに、自身のメールアドレスを設定しました。他の設定はデフォルトのままでサブスクリプションを作成します。
メールアドレスの確認を行うまではサブスクリプションのステータスが 保留中の確認となっているので、メールアドレスの確認を行っていきます。
先ほどエンドポイントとして設定したメールアドレス当てに下記の様に確認メールが来ています。
先ほど作成した SNS トピックからのメールで、このメールアドレスをサブスクリプションとして登録しても良い場合は、リンクをクリックしてメールアドレスの確認を行ってくださいという旨のメールです。
クリックすると下記のようなページが表示され、サブスクリプションの確認が成功したことが分かります。
コンソールも見てみましょう。
ステータスが確認済みになっています。これで SNS 側の準備は完了です。
Lambda 関数の設定
SNS の準備が終わったので今回作成する Lambda が SNS を呼び出すことが出来るように Lambda の実行ロールを作成してあげます。
IAM コンソールの左側のナビゲーションペインから ポリシーを選択してポリシーを作成します。
今回はビジュアルエディタを使ってコンソールから簡単にポリシーを生成してみます。
サービスを選択の項目で SNSを選択すると、アクション許可の選択ができるようになるので、 書き込みの Publishにチェックを入れます。
リソースは すべてを選択します。
JSON エディタに切り替えてみると下記のような IAM ポリシーが勝手に作成されています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sns:Publish",
"Resource": "*"
}
]
}
このポリシーはアカウント内のすべての SNS トピックに対して、メッセージの送信を許可するポリシーです。
sns-publish-policyという名前で保存します。
次に特定の API コールイベント(今回は EC2 インスタンスの再起動)が発生した際に SNS を呼び出す為の Lambda 関数を作成していきます。
分かりやすい関数名を付けて以下の設定で関数を作成します。
今回は api-calls-notify-functionという名前でほかはデフォルト設定で関数を作成します。
作成した Lambda 関数名をクリックし、関数の概要ページを表示します。
設定タブのアクセス権限を見てみましょう。
作成した覚えはないのに実行ロール欄にロール名が記載されていますね。
デフォルト設定のままで Lambda 関数を作成すると、基本的な Lambda の実行権限を持ったロールを勝手に作成してくれます。
このロールに先ほど作成したポリシーをアタッチしてあげます。ロール名をクリックしてロールの詳細画面を表示させます。
許可ポリシーの 許可を追加から ポリシーをアタッチを選択します。
先ほど作成した sns-publish-policyにチェックを入れて、許可を追加します。
許可ポリシーに sns-publish-policyが追加されていれば OK です。
では Lambda の画面に戻って設定を続けます。
コードソース内の既存のコードを以下に置き換えます。
import SNS from "@aws-sdk/client-sns";
const snsClient = new SNS.SNSClient();
export const handler = async (event) => {
const subject = "EC2インスタンスが再起動しました。";
const message = "EC2インスタンスの再起動を検知しました。対応してください。";
const topicArn = "SNSトピックARNを記入";
try {
const response = await snsClient.send(
new SNS.PublishCommand({
Message: message,
Subject: subject,
TopicArn: topicArn,
})
);
console.log(response);
return response;
} catch (error) {
console.error(error);
throw error;
}
};
そのままデプロイします。
Lambda 関数が正常に更新されたことを確認し、テストしてみましょう。
先ほど SNS にサブスクリプションとして登録したメールアドレスに下記のようなメールが届いていれば成功です。
次は EventBridge ルールを作成していきます。
EventBridge の設定
上記で作成した Lambda 関数が EC2 インスタンスが再起動されるたびに実行されるように EventBridge ルールを作成していきます。
EventBridge コンソールのナビゲーションペインからルールを選択し、ルールの作成をしていきます。
ルール名は分かりやすければ何でもいいです。今回は monitaring-RebootInstance-eventとしました。
ほかはデフォルト設定のまま、次へ進みます。
イベントソースは AWS イベントまたは EventBridge パートナーイベントを選択します。
イベントパターンは下記の通り設定します。
項目 | 設定値 |
---|---|
イベントソース | AWS のサービス |
AWS のサービス | EC2 |
イベントタイプ | AWS API Call via CloudTrail |
イベントタイプの仕様 | 特定のオペレーション |
特定のオペレーション | RebootInstance |
特定のオペレーションの項目を変えれば、様々な API コールに関してこの先ほど作った Lmabda 関数を呼び出すことが出来るようになります。
例えば、EC2 が停止したときだけ通知を行いたい場合は「StopInstance」とするといった具合です。
コンソールでポチポチしていけば、勝手にイベントパターンを作成してくれます。
作成されたイベントパターンを見てみるとこんな感じになってます。
{
"source": ["aws.ec2"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["ec2.amazonaws.com"],
"eventName": ["RebootInstance"]
}
}
上記であればあまりコーディングの知識がなくても簡単にイベントパターンを作成することが出来ますが、さらに複雑な条件で Lambda を起動させたい場合はイベントパターンを直接作成するのが良いと思います。
より複雑なイベントパターンの作成には下記のブログが参考になりそうです。
今回はこのイベントパターンで Lambda を呼び出すのでこのまま次へ進みます。
ターゲットの選択画面へ移るのでターゲットタイプを AWS のサービスにしてドロップダウンリストから Lambda 関数を選択します。
関数の項目のドロップダウンリストを確認するとアカウント内に作成済みの関数の候補が出てくるので、先ほど作成した関数を設定して次へ進みます。
タグが必要な場合は適切に設定して、設定内容を確認しましょう。問題なければルールを作成します。
テスト
すべてのリソースが作成されたら、実際に動くかテストをしてみましょう。
何でもいいので EC2 を作成して再起動をしてみます。
私の場合はちょうど検証用に立てていた EC2 があったのでそちらで試してみました。
テストをしてみると、再起動直後にきちんとメールが飛んできました!
私の場合は再起動してから、数秒でメールが届いていました。
終わりに
今回ご紹介した方法の様に EventBrige のイベントソースとして CloudTrail によって記録された API コールを指定してあげれば、EC2 の再起動や停止に限らず様々なイベントを検知したときに SNS でメール通知を行うことが可能です。
Lambda をうまく作り込めば日本語で任意のメッセージが送られてくるように設定が可能なのも嬉しいポイントですね。
本ブログが EC2 の再起動の検知を行いたい方のお役に立てたらうれしいです。